/**
 * 接口：interface 规范类或者对象的格式的一种工具
 *  接口用来规范类的时候 其效果和 抽象类也非常的像
 */
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
/**
 * 总结 接口与抽象类的区别
 *  - 接口可以规范对象 抽象类只能规范类
 *  - 接口只能定义类型，不能有具体的实现，抽象类除了抽象方法 还能有自己的方法
 *  - 类继承接口规范使用的是 implements 关键字，类继承抽象类，使用的是 extends 关键字
 */
{
    /**
     * 类继承接口规范 使用的是 implements 关键字
     */
    var Dog = /** @class */ (function () {
        function Dog() {
        }
        Dog.prototype.eat = function () {
            console.log('dog eat food');
        };
        return Dog;
    }());
    var dog = new Dog();
    dog.eat();
    var animal2 = /** @class */ (function () {
        function animal2() {
        }
        /**
         * 抽象类 出了抽象方法 还能有自己的方法
         */
        animal2.prototype.show = function () {
            console.log('hello world');
        };
        return animal2;
    }());
    /**
     * 类继承抽象类 使用的是 extends 关键字
     */
    var Cat = /** @class */ (function (_super) {
        __extends(Cat, _super);
        function Cat() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        Cat.prototype.eat = function () {
            console.log('cat eat food');
        };
        return Cat;
    }(animal2));
    var cat = new Cat();
    cat.eat();
}
